#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
海报布局配置模块
将海报的布局信息结构化为数据配置
"""

from typing import Dict, Any, List, Tuple
from dataclasses import dataclass
from enum import Enum


class LayoutElementType(Enum):
    """布局元素类型"""
    TEXT = "text"
    IMAGE = "image"
    RECTANGLE = "rectangle"


class TextAlignment(Enum):
    """文本对齐方式"""
    LEFT = "left"
    CENTER = "center"
    RIGHT = "right"


@dataclass
class LayoutElement:
    """
    布局元素基类
    """
    element_type: LayoutElementType
    name: str  # 元素名称
    position: Tuple[float, float]  # 位置 (x, y) 相对于图片尺寸的比例
    size: Tuple[float, float]  # 尺寸 (width, height) 相对于图片尺寸的比例
    visible: bool = True  # 是否可见


@dataclass
class TextElement(LayoutElement):
    """
    文本元素
    """
    content: str = ""  # 文本内容
    font_size_ratio: float = 0.05  # 字体大小相对于图片高度的比例
    font_color: Tuple[int, int, int, int] = (255, 255, 255, 255)  # 字体颜色 RGBA
    font_path: str = ""  # 字体文件路径
    bold: bool = False  # 是否加粗
    alignment: TextAlignment = TextAlignment.CENTER  # 对齐方式
    shadow: bool = False  # 是否有阴影
    shadow_color: Tuple[int, int, int, int] = (0, 0, 0, 255)  # 阴影颜色
    shadow_offset: Tuple[int, int] = (1, 1)  # 阴影偏移


@dataclass
class ImageElement(LayoutElement):
    """
    图片元素
    """
    image_path: str = ""  # 图片路径
    image_data: str = ""  # 图片base64数据
    resize_mode: str = "fit"  # 调整大小模式: fit, fill, stretch


@dataclass
class RectangleElement(LayoutElement):
    """
    矩形元素
    """
    fill_color: Tuple[int, int, int, int] = (0, 0, 0, 0)  # 填充颜色 RGBA
    border_color: Tuple[int, int, int, int] = (0, 0, 0, 255)  # 边框颜色
    border_width: int = 0  # 边框宽度


class PosterLayoutConfig:
    """
    海报布局配置类
    """
    
    def __init__(self):
        self.layouts = {
            "horizontal": self._get_horizontal_layout(),
            "vertical": self._get_vertical_layout()
        }
    
    def _get_horizontal_layout(self) -> List[LayoutElement]:
        """
        获取横版海报布局配置
        """
        layout_elements = [
            # 标题文本（足球越南语）
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="title",
                position=(0.5, 0.1),  # 居中，位于图片高度10%处
                size=(0.8, 0.1),  # 宽度80%，高度10%
                content="Bóng đá",
                font_size_ratio=0.1,  # 字体大小为图片高度的10%
                font_color=(255, 255, 255, 255),
                font_path="title.ttf",
                bold=True,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(0, 0, 0, 255),
                shadow_offset=(3, 3)
            ),
            
            # 主文案第一部分
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="copywriting_first",
                position=(0.5, 0.375),  # 居中，位于图片高度37.5%处
                size=(0.8, 0.1),  # 宽度80%，高度10%
                content="",
                font_size_ratio=0.05,  # 字体大小为图片高度的5%
                font_color=(255, 255, 255, 255),
                font_path="copywriting_first.ttf",
                bold=True,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(0, 0, 0, 255),
                shadow_offset=(3, 3)
            ),
            
            # 主文案第二部分
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="copywriting_second",
                position=(0.5, 0.5625),  # 居中，位于图片高度56.25%处
                size=(0.8, 0.2),  # 宽度80%，高度20%
                content="",
                font_size_ratio=0.035,  # 字体大小为图片高度的3.5%
                font_color=(255, 255, 255, 255),
                font_path="copywriting_second.ttf",
                bold=True,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(0, 0, 0, 255),
                shadow_offset=(1, 1)
            ),
            
            # Telegram图标
            ImageElement(
                element_type=LayoutElementType.IMAGE,
                name="telegram_icon",
                position=(0.5, 0.65625),  # 居中，位于图片高度65.625%处
                size=(0.0125, 0.0125),  # 大小为图片高度的1.25%
                image_path="static/images/telegram.png",
                resize_mode="fit"
            ),
            
            # Telegram文本
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="telegram_text",
                position=(0.5, 0.65625),  # 与图标同一水平线
                size=(0.2, 0.02),  # 宽度20%，高度2%
                content="LUCKYFF8",
                font_size_ratio=0.0125,  # 字体大小为图片高度的1.25%
                font_color=(255, 255, 255, 255),
                font_path="telegram.ttf",
                bold=False,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(0, 0, 0, 255),
                shadow_offset=(1, 1)
            ),
            
            # 比赛时间
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="match_time",
                position=(0.5, 0.6875),  # 居中，位于图片高度68.75%处
                size=(0.4, 0.03),  # 宽度40%，高度3%
                content="",
                font_size_ratio=0.03,  # 字体大小为图片高度的3%
                font_color=(255, 255, 0, 255),  # 黄色
                font_path="datetime.ttf",
                bold=True,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(0, 0, 0, 255),
                shadow_offset=(1, 1)
            ),
            
            # 队伍A图标
            ImageElement(
                element_type=LayoutElementType.IMAGE,
                name="team_a_logo",
                position=(0.25, 0.375),  # 左侧1/4处，位于图片高度37.5%处
                size=(0.12, 0.12),  # 大小为图片高度的12%
                image_data="",  # 动态数据
                resize_mode="fit"
            ),
            
            # 队伍B图标
            ImageElement(
                element_type=LayoutElementType.IMAGE,
                name="team_b_logo",
                position=(0.75, 0.375),  # 右侧1/4处，位于图片高度37.5%处
                size=(0.12, 0.12),  # 大小为图片高度的12%
                image_data="",  # 动态数据
                resize_mode="fit"
            ),
            
            # 队伍A名称
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="team_a_name",
                position=(0.25, 0.45),  # 队伍A图标下方
                size=(0.2, 0.03),  # 宽度20%，高度3%
                content="",
                font_size_ratio=0.03,  # 字体大小为图片高度的3%
                font_color=(255, 255, 255, 255),
                font_path="team_name.ttf",
                bold=True,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(255, 0, 0, 255),  # 红色描边
                shadow_offset=(1, 1)
            ),
            
            # 队伍B名称
            TextElement(
                element_type=LayoutElementType.TEXT,
                name="team_b_name",
                position=(0.75, 0.45),  # 队伍B图标下方
                size=(0.2, 0.03),  # 宽度20%，高度3%
                content="",
                font_size_ratio=0.03,  # 字体大小为图片高度的3%
                font_color=(255, 255, 255, 255),
                font_path="team_name.ttf",
                bold=True,
                alignment=TextAlignment.CENTER,
                shadow=True,
                shadow_color=(0, 0, 255, 255),  # 蓝色描边
                shadow_offset=(1, 1)
            )
        ]
        
        return layout_elements
    
    def _get_vertical_layout(self) -> List[LayoutElement]:
        """
        获取竖版海报布局配置
        """
        # 竖版布局可以基于横版布局进行调整
        horizontal_layout = self._get_horizontal_layout()
        vertical_layout = []
        
        for element in horizontal_layout:
            # 复制元素并调整位置和大小以适应竖版
            new_element = element.__class__(**element.__dict__)
            
            # 调整Y坐标以适应竖版布局
            if hasattr(new_element, 'position'):
                x, y = new_element.position
                # 简单的Y坐标调整，可以根据需要进一步优化
                new_element.position = (x, min(y * 1.2, 0.9))
            
            vertical_layout.append(new_element)
        
        return vertical_layout
    
    def get_layout(self, layout_type: str = "horizontal") -> List[LayoutElement]:
        """
        获取指定类型的布局配置
        
        Args:
            layout_type (str): 布局类型 ("horizontal" 或 "vertical")
            
        Returns:
            List[LayoutElement]: 布局元素列表
        """
        return self.layouts.get(layout_type, self.layouts["horizontal"])
    
    def get_element_by_name(self, layout_type: str, name: str) -> LayoutElement:
        """
        根据名称获取布局元素
        
        Args:
            layout_type (str): 布局类型
            name (str): 元素名称
            
        Returns:
            LayoutElement: 布局元素
        """
        layout = self.get_layout(layout_type)
        for element in layout:
            if element.name == name:
                return element
        return None


# 全局实例
poster_layout_config = PosterLayoutConfig()